// 1812. [模拟] 矩阵列的最大值中的最小值
// https://oj.rnd.huawei.com/problems/1812/details 现给定一个 n * m
//矩阵。请先找出每列元素的最大值，合计 m 个；然后输出这 m 个值中的最小值。 输入
//首行为两个整数 n m，表示矩阵有n行、m列, 取值范围均为：[1,100] 接下来 n
//行，每行 m 个元素，每个元素的取值范围：[-10000,10000] 输出 整数，表示所求的值
//输入
// 3 2
// 1 2
// 3 4
// 2 4
//输出 3
//第1列最大值为3，第二列最大值为4，这两个值的最小值为3，输出3

#include <bits/stdc++.h>
using namespace std;

#define DEBUG
#ifdef DEBUG
#define PF(...) printf(__VA_ARGS__)
#else
#define PF(...)
#endif

#include <algorithm>
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;

class Solution {
 public:
  // 待实现函数，在此函数中填入答题代码;
  int GetTheMinWithColMaxs(const vector<vector<int>> &matrix) {
    int n = matrix.size();
    int m = matrix[0].size();
    int nMin = 0x6fffffff;
    for (int j = 0; j < m; j++) {
      int nMax = matrix[0][j];
      for (int i = 0; i < n; i++) {
        nMax = max(matrix[i][j], nMax);
      }
      nMin = min(nMax, nMin);
    }
    return nMin;
  }
};

int main() {
  int row, col;
  cin >> row >> col;
  cin.ignore();

  vector<vector<int>> matrix;
  for (int loop = 0; loop < row; loop++) {
    string line;
    getline(cin, line);

    istringstream iss(line);
    vector<int> rows;
    while (!iss.eof()) {
      int value;
      iss >> value;
      rows.push_back(value);
    }
    matrix.push_back(rows);
  }
  Solution solu;
  int result = solu.GetTheMinWithColMaxs(matrix);
  cout << result << endl;
  return 0;
}
